﻿using System.Collections.Generic;
using System.Linq;
using MIAP.DataAccess.Interfaces;
using MIAP.DataAccess.SqlServer.Model;
using MIAP.Entidades;
using MIAP.Entidades.Enums;

namespace MIAP.DataAccess.Implementaciones.SQL
{
    /// <summary>
    /// Clase de las operaciones de acceso a datos de la vista Consulta Cargas Proyecto.
    /// </summary>
    public class ConsultaCargasProyectoDao : IConsultaCargasProyectoDao
    {
        /// <summary>
        /// Obtiene todos los archivos obligatorios.
        /// </summary>
        /// <param name="archivoAsociadoFilters">Filtros para obtener los archivos obligatorios.</param>        
        /// <param name="esObligatorio">Indica si se buscan archivos obligatorios o no</param>
        /// <returns>Lista con los archivos obligatorios de acuerdo a los filtros.</returns>
        public IList<ArchivoAsociadoProyectoInfo> GetArchivosObligatoriosAndNoObligatorios(ArchivoAsociadoProyectoInfo archivoAsociadoFilters, bool esObligatorio)
        {
            List<ArchivoAsociadoProyectoInfo> result;

            using (var context = new MIAPDBEntities())
            {
                var query = (from archivo in context.MIAP_ARCHIVO
                             join proyecto in context.MIAP_PROYECTO
                             on archivo.ID_PROYECTO equals proyecto.ID_PROYECTO
                             join cargaArchivo in context.MIAP_CARGA_ARCHIVO
                             on archivo.ID_ARCHIVO equals cargaArchivo.ID_ARCHIVO
                             join bitacoraCargaArchivo in context.MIAP_BITACORA_GENERAL_CARGA_ARCHIVO
                             on cargaArchivo.ID_CARGA_ARCHIVO equals bitacoraCargaArchivo.ID_CARGA_ARCHIVO
                             join bitacoraGeneral in context.MIAP_BITACORA_GENERAL
                             on bitacoraCargaArchivo.ID_BITACORA_GENERAL equals bitacoraGeneral.ID_BITACORA_GENERAL
                             where ((!archivoAsociadoFilters.IdProyecto.HasValue || archivoAsociadoFilters.IdProyecto == archivo.ID_PROYECTO)
                             && (archivo.OBLIGATORIO == esObligatorio)
                             && (archivo.ACTIVO == true)
                             && (bitacoraGeneral.ID_ESTATUS_PROCESO == (int)EstatusProceso.Finalizado_Correcto))
                             select new ArchivoAsociadoProyectoInfo()
                             {
                                 IdArchivo = archivo.ID_ARCHIVO,
                                 NombreArchivo = archivo.NOMBRE,
                                 NombreProyecto = proyecto.NOMBRE,
                                 Carga = (from cargaArchivoByFecha in context.MIAP_BITACORA_GENERAL_CARGA_ARCHIVO
                                          where ((!archivoAsociadoFilters.Año.HasValue || (cargaArchivoByFecha != null && cargaArchivoByFecha.MIAP_CARGA_ARCHIVO.AÑO == archivoAsociadoFilters.Año))
                                                       && (!archivoAsociadoFilters.Mes.HasValue || (cargaArchivoByFecha != null && cargaArchivoByFecha.MIAP_CARGA_ARCHIVO.MES == archivoAsociadoFilters.Mes))
                                                       && cargaArchivoByFecha.MIAP_CARGA_ARCHIVO.ID_ARCHIVO == archivo.ID_ARCHIVO
                                                       && cargaArchivoByFecha.MIAP_BITACORA_GENERAL.ID_ESTATUS_PROCESO == (int)EstatusProceso.Finalizado_Correcto)
                                          select cargaArchivoByFecha).FirstOrDefault() == null ? "NO" : "SI",
                                 Version = archivo.VERSION == true ? "SI" : "NO",
                                 Versionable = archivo.VERSION
                             }).Distinct().ToList();

                result = query;
            }

            return result;
        }

        /// <summary>
        /// Obtiene todas las cargas y recargas de archivos realizadas de acuerdo a los filtros.
        /// </summary>
        /// <param name="archivoAsociadoFilters">Filtros para la búsqueda.</param>
        /// <returns>Lista con las cargas y recargas de archivos.</returns>
        public IList<ArchivoCargadoInfo> GetCargasRealizadasByPeriodo(ArchivoAsociadoProyectoInfo archivoAsociadoFilters)
        {
            IList<ArchivoCargadoInfo> result;

            using (var context = new MIAPDBEntities())
            {
                var query = from bitacoraArchivo in context.MIAP_BITACORA_ARCHIVO
                            join bitacoraGeneral in context.MIAP_BITACORA_GENERAL
                            on bitacoraArchivo.ID_BITACORA_GENERAL equals bitacoraGeneral.ID_BITACORA_GENERAL
                            join bitacoraGeneralCargaArchivo in context.MIAP_BITACORA_GENERAL_CARGA_ARCHIVO
                            on bitacoraGeneral.ID_BITACORA_GENERAL equals bitacoraGeneralCargaArchivo.ID_BITACORA_GENERAL
                            join cargaArchivo in context.MIAP_CARGA_ARCHIVO
                            on bitacoraGeneralCargaArchivo.ID_CARGA_ARCHIVO equals cargaArchivo.ID_CARGA_ARCHIVO
                            join archivo in context.MIAP_ARCHIVO
                            on bitacoraArchivo.ID_ARCHIVO equals archivo.ID_ARCHIVO
                            join proyecto in context.MIAP_PROYECTO
                            on archivo.ID_PROYECTO equals proyecto.ID_PROYECTO
                            where ((archivo.ACTIVO == true)
                            && (!archivoAsociadoFilters.IdProyecto.HasValue || (archivo.ID_PROYECTO == archivoAsociadoFilters.IdProyecto))
                            && (!archivoAsociadoFilters.Mes.HasValue || (cargaArchivo.MES == archivoAsociadoFilters.Mes))
                            && (!archivoAsociadoFilters.Año.HasValue || (cargaArchivo.AÑO == archivoAsociadoFilters.Año))
                            && (bitacoraGeneral.ID_ESTATUS_PROCESO == (int)EstatusProceso.Finalizado_Correcto))
                            select new ArchivoCargadoInfo
                            {
                                IdCargaArchivo = cargaArchivo.ID_CARGA_ARCHIVO,
                                IdArchivo = archivo.ID_ARCHIVO,
                                IdProyecto = archivo.ID_PROYECTO,
                                NombreEjecutorCarga = cargaArchivo.USUARIO_MODIFICACION,
                                NombreProyecto = proyecto.NOMBRE,
                                NombreArchivo = archivo.NOMBRE,
                                TipoProceso = bitacoraGeneral.MIAP_TIPO_PROCESO.NOMBRE,
                                FechaProceso = bitacoraArchivo.FECHA_ACTUALIZACION,
                                Año = cargaArchivo.AÑO,
                                Mes = cargaArchivo.MES,
                                Version = cargaArchivo.VERSION,
                                Versionable = archivo.VERSION,
                                VersionValida = cargaArchivo.VERSION_VALIDA == true ? "Si" : ""
                            };

                result = query.ToList();
            }

            return result;
        }


        /// <summary>
        /// Obtiene todas las cargas y recargas de archivos realizadas de acuerdo a los filtros, se muestran en cualquier etatus
        /// Inicio finalizado correcto o con errores.
        /// </summary>
        /// <param name="archivoAsociadoFilters">Filtros para la búsqueda.</param>
        /// <returns>Lista con las cargas y recargas de archivos.</returns>
        public IList<ArchivoCargadoInfo> GetCargasRealizadasByPeriodoTodosEstatus(ArchivoAsociadoProyectoInfo archivoAsociadoFilters)
        {
            IList<ArchivoCargadoInfo> result;

            using (var context = new MIAPDBEntities())
            {
                var query = from bitacoraArchivo in context.MIAP_BITACORA_ARCHIVO
                            join bitacoraGeneral in context.MIAP_BITACORA_GENERAL
                            on bitacoraArchivo.ID_BITACORA_GENERAL equals bitacoraGeneral.ID_BITACORA_GENERAL
                            join bitacoraGeneralCargaArchivo in context.MIAP_BITACORA_GENERAL_CARGA_ARCHIVO
                            on bitacoraGeneral.ID_BITACORA_GENERAL equals bitacoraGeneralCargaArchivo.ID_BITACORA_GENERAL
                            join cargaArchivo in context.MIAP_CARGA_ARCHIVO
                            on bitacoraGeneralCargaArchivo.ID_CARGA_ARCHIVO equals cargaArchivo.ID_CARGA_ARCHIVO
                            join archivo in context.MIAP_ARCHIVO
                            on bitacoraArchivo.ID_ARCHIVO equals archivo.ID_ARCHIVO
                            join proyecto in context.MIAP_PROYECTO
                            on archivo.ID_PROYECTO equals proyecto.ID_PROYECTO
                            join miapestatusProceso in context.MIAP_ESTATUS_PROCESO
                            on bitacoraGeneral.ID_ESTATUS_PROCESO equals miapestatusProceso.ID_ESTATUS_PROCESO
                            where ((archivo.ACTIVO == true)
                            && (!archivoAsociadoFilters.IdProyecto.HasValue || (archivo.ID_PROYECTO == archivoAsociadoFilters.IdProyecto))
                            && (!archivoAsociadoFilters.Mes.HasValue || (cargaArchivo.MES == archivoAsociadoFilters.Mes))
                            && (!archivoAsociadoFilters.Año.HasValue || (cargaArchivo.AÑO == archivoAsociadoFilters.Año))                            )
                            select new ArchivoCargadoInfo
                            {
                                IdCargaArchivo = cargaArchivo.ID_CARGA_ARCHIVO,
                                IdArchivo = archivo.ID_ARCHIVO,
                                IdProyecto = archivo.ID_PROYECTO,
                                NombreEjecutorCarga = cargaArchivo.USUARIO_MODIFICACION,
                                NombreProyecto = proyecto.NOMBRE,
                                NombreArchivo = archivo.NOMBRE,
                                TipoProceso = bitacoraGeneral.MIAP_TIPO_PROCESO.NOMBRE,
                                FechaProceso = bitacoraArchivo.FECHA_ACTUALIZACION,
                                Año = cargaArchivo.AÑO,
                                Mes = cargaArchivo.MES,
                                Version = cargaArchivo.VERSION,
                                Versionable = archivo.VERSION,
                                VersionValida = cargaArchivo.VERSION_VALIDA == true ? "Si" : "",
                                EstatusProceso = miapestatusProceso.NOMBRE,
                                IdEstatusProceso = miapestatusProceso.ID_ESTATUS_PROCESO,
                                FechaInicioProceso = bitacoraArchivo.INICIO_CARGA,
                                FechaFinProceso = bitacoraArchivo.FIN_CARGA
                            };

                result = query.ToList();
            }

            return result;
        }
    }
}
